static void main(String[] args) {

    // 方法调用时, 在不含有歧义的地方可以省略方法调用是的「括号」
    println "Hello world!"


    def sum = 0;
    // 闭包: Groovy 中闭包是一个开放的、匿名的代码块, 它可以接受参数, 也可以有返回值. 闭包可以引用其周围作用域中声明的变量
    def item = 0;
    // 闭包题完成遍历自增操作
    {
        item++
    };

    // 闭包使用 空参数列表 明确规定这是无参
    {
        -> item++
    };

    // 闭包也可以接受多个参数
    {
        String str, int num ->
            println("hey ${str} the value is ${num}")
    };

    // 闭包参数也可以是一个对象
//    def time = new LocalDateTime()
//            { time ->
//                println(time)
//            };


    println item


    // Tips: 可以把闭包当做一个对象, 作为参数传递给方法使用
    run({
        println(">>> closure running...")
    })

    // 其实在 build.gradle 文件中我们见到的很多都是闭包格式
    calculate({
        defaultNum, step ->
            {
                println(">>> calculate .......")
                sum = (sum + defaultNum) * step
                println("计算结果为: ${sum}")
            }
    })
}


// 无参闭包
def run(Closure closure) {
    println("run start...")
    closure() println("run end...")
}

// 有参闭包
def calculate(Closure closure) {
    def defaultNum = 1
    def step = 5;
    println("calculate start...")
    closure(defaultNum, step)
    println("calculate end...")
}